#ifndef _TPILAPORO_
#define _TPILAPORO_

#include "tporo.h"
#include "tvectorporo.h"
#include <iostream>
using namespace std;

/** \file tpilaporo.h
* \brief Cabeceras de la clase TPilaPoro
*/

/** \class TPilaPoro
* \brief Clase TPilaPoro
* Clase completa para construir TPilaPoro
*/
class TPilaPoro
{
	public:
		/** \brief Constructor por defecto
		* Construye un objeto TPilaPoro con valores inicializados
		*/
		TPilaPoro();

		/** \brief Constructor de copia
		* Crea una copia de la pila que recibe
                 * \param p Pila de la que copiar
		*/
		TPilaPoro(const TPilaPoro &p);

		/** \brief Destructor
		* Destruye el objeto liberando memoria de las variables
		*/
		~TPilaPoro();

		/** \brief Sobrecarga del operador asignación
		* Copia los valores de un objeto a otro
                 * \param p Pila de la que copiar
                 * \return Objeto copiado
		*/
		TPilaPoro & operator=(const TPilaPoro &);

		/** \brief Sobrecarga del operador igualdad
		* Compara los dos objetos y devuelve un bool
                 * \param p Poro a comparar
                 * \return Devuelve si es verdadero o falso
		*/
		bool operator==(const TPilaPoro &p) const;

		/** \brief Devuelve cierto si el poro está vacío
		* Verifica que todos los parametros esten inicializados a default y devuelve un bool
                 * \return Devuelve verdadero o falso
		*/
		bool EsVacia() const;

		/** \brief Apilar
		* Añade un elemento delante de la pila, mediante InsCabeza
                 * \param c Poro a apilar
                 * \return Devuelve verdadero o falso
		*/
		bool Apilar(const TPoro &c);
                
		/** \brief Desapilar
		* Quita con borrar el poro en cabeza
                 * \return Devuelve verdadero o falso
		*/
		bool Desapilar();
                
		/** \brief Cima
		* Devuelve el objeto que esta en la cima de la pila
                 * \return Devuelve el objeto
		*/
		TPoro Cima() const;

		/** \brief Longitud
		* Devuelve la cantidad de poros almacenados en la pila
                 * \return Devuelve el valor
		*/
		int Longitud() const;
                
		/** \brief Sobrecarga del operador +
		* Hace una suma mediante apilaciones entre dos pilas
                 * \param p Pila a la que sumar
                 * \return Devuelve pila resultado
		*/
		TPilaPoro operator+(const TPilaPoro &) const;
		
                /** \brief Sobrecarga del operador salida.
                * Imprime por pantalla el objeto TPilaPoro.
                * \param os objeto de salida.
                * \param p tipo TPilaPoro.
                * \return ostream&
                */
		friend ostream & operator<<(ostream &,const TPilaPoro &);

	private:
		/** \brief Vector de poros.
		* 	Variable que representa un vector de poros.
		*/
		TVectorPoro v;
		/** \brief Entero posicion.
		* 	Variable que representa la posicion del objeto en la cima.
		*/
		int posicion;
		/** \brief Poro error.
		*   Poro que representa un poro vacio para el error.
		*/
                TPoro error;
};

#endif
